package classpath

import (
	"io/ioutil"
	"path/filepath"
)

type DirEntry struct {
	absDir string
}

// 获取文件夹的绝对路径名称，将来会在这个文件夹下查找class文件
func newDirEntry(path string) *DirEntry {
	// Abs函数返回path代表的绝对路径，如果path不是绝对路径，会加入当前工作目录以使之成为绝对路径。
	// 因为硬链接的存在，不能保证返回的绝对路径是唯一指向该地址的绝对路径。
	absDir, err := filepath.Abs(path)
	if err != nil {
		panic(err)
	}
	return &DirEntry{absDir}
}

// 从指定的文件夹下查找类的字节流
func (self *DirEntry) ReadClass(classname string) ([]byte, Entry, error) {
	// Join函数可以将任意数量的路径元素放入一个单一路径里，会根据需要添加路径分隔符。
	// 结果是经过简化的，所有的空字符串元素会被忽略
	fileName := filepath.Join(self.absDir, classname)
	// ReadFile 从filename指定的文件中读取数据并返回文件的内容。
	//成功的调用返回的err为nil而非EOF。
	//因为本函数定义为读取整个文件，它不会将读取返回的EOF视为应报告的错误
	data, err := ioutil.ReadFile(fileName)
	return data, self, err
}

// 返回此DirEntry的字符串表示
func (self *DirEntry) String() string {
	return self.absDir
}
